<template>
  <div class="swiper-container" ref="swiper">
    <div class="swiper-wrapper">
      <!-- 轮播图图片 -->
      <div class="swiper-slide" v-for="(img, index) in imageList" :key="index">
        <img :src="img.imgUrl" :alt="img.imgName" />
      </div>
    </div>
    <!-- 翻页器 -->
    <div class="swiper-button-next"></div>
    <div class="swiper-button-prev"></div>
    <!-- 分页器 -->
    <div class="swiper-pagination"></div>
  </div>
</template>

<script>
import Swiper from 'swiper'
import 'swiper/css/swiper.min.css'
export default {
  props: {
    imageList: {
      type: Array,
      // 默认值是一个空数组,复杂数据类型要用函数返回值
      default: () => [],
    },
  },
  data() {
    return {
      isInit: false,
    }
  },
  // 对轮播图的数据进行监控,要等dom渲染完成之后,再更新数据
  // 因为vue是异步更新,即数据是新的,但是dom是旧的
  watch: {
    imageList: {
      handler(imageList) {
        // 判断imageList是否为空,如果为空,则直接return
        // 设置了一个isInit开关,如果isInit是true,直接return,并且,进去后,讲isInit的值修改为true,这样,就可以确保跳转到其他页面再跳转回来的时候不会出现hover后仍在轮播的情况
        if (!imageList.length || this.isInit) return
        this.isInit = true
        // dom渲染后才会执行nextTick,并且只执行一次
        this.$nextTick(() => {
          // 因为页面有多个轮播图,所以不建议使用类名来选择轮播图,使用ref属性来选择,可以选中实际的这个轮播图,并且能确保选中的只有这一个
          const mySwiper = new Swiper(this.$refs.swiper, {
            // 左右箭头
            navigation: {
              nextEl: '.swiper-button-next',
              prevEl: '.swiper-button-prev',
            },
            // 小圆点
            pagination: {
              el: '.swiper-pagination',
            },
            // 无缝切换
            loop: true,
            // 自动轮播
            autoplay: {
              delay: 1000,
              disableOnInteraction: false, //鼠标操作后,自动轮播继续,false为继续轮播,true为不自动轮播
            },
          })
          // 鼠标移入则轮播停止
          mySwiper.el.onmouseenter = () => {
            mySwiper.autoplay.stop()
          }
          // 鼠标移出,轮播继续
          mySwiper.el.onmouseleave = () => {
            mySwiper.autoplay.start()
          }
        })
      },
      // 第一次的数据是否需要watch:要的
      immediate: true,
    },
  },
}
</script>

<style lang="less" scoped></style>
